home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gekkan Dennou Club 142
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan).7z
/
Gekkan Dennou Club - 2000.3 Vol. 142 (Japan) (Track 1).bin
/
tools
/
s44play
/
s44p101s.lzh
/
cdrom.s
< prev
next >
Wrap
Text File
|
1999-12-19
|
35KB
|
1,426 lines
.include iocscall.mac
.include scsiconst.equ
.include CDC.MAC
.include global.mac
;----------------------------------------------------------------
;SCSI-IDの初期化
.text
.align 4,$2048
init_scsiid::
move.l param_scsiid,d0
bpl 10f
tst.b cdrom_env_work
beq 80f
bra 81f
10: move.l d0,scsiid
98: moveq.l #0,d0
99: rts
80: move.w #EXIT_SCSIID_MISSING,exit_code
lea.l (m_id_not_specified,pc),a0
bra 89f
81: move.w #EXIT_ILLEGAL_ENV_CDROM,exit_code
lea.l (m_illegal_cdrom_env,pc),a0
89: bsr print_banner
bsr eaprintcrlf
90: moveq.l #-1,d0
bra 99b
m_id_not_specified: .dc.b 'SCSI-ID が指定されていません',0
m_illegal_cdrom_env: .dc.b '環境変数 CDROM の内容が異常です',0
;----------------------------------------------------------------
;CD-ROMドライブの準備
; scsiidを設定してからコールすること
;>d0.l:0=正常終了,-1=エラー
;>n-flag:mi=エラー
.text
.align 4,$2048
init_cdrom::
movem.l d1-d7/a0-a6,-(sp)
move.l scsiid,d0
cmp.l initialized_scsiid,d0
beq 98f
move.l initialized_scsiid,d0
bmi @f
move.l scsiid,-(sp)
move.l d0,scsiid
bsr tini_cdrom
move.l (sp)+,scsiid
@@:
;指定されたSCSI-IDの装置が使えるか調べる
lea.l inquiry_buffer,a4
moveq.l #INQUIRY_RETRY_COUNT-1,d7
1: movea.l a4,a1
moveq.l #5,d3 ;拡張データサイズを得る
move.l scsiid,d4
SCSI _S_INQUIRY
move.l d0,d1
beq 2f
moveq.l #50,d0 ;0.5秒待つ
bsr wait_sec
dbra d7,1b
move.l d1,d0
bmi 80f ;指定されたSCSI-IDの装置は動作不可能
bne 81f ;inquiryを取得できない
2:
;inqiryを取得する
movea.l a4,a1
moveq.l #0,d3
move.b (SCSINQ_ADDLEN,a4),d3 ;拡張データサイズ
move.l scsiid,d4
SCSI _S_INQUIRY
tst.l d0
bne 81f ;inquiryを取得できない
;指定されたSCSI-IDの装置はCD-ROMか?
cmpi.b #SCSI_TYPE_CDROM,(SCSINQ_TYPE,a4)
bne 82f ;指定されたSCSI-IDの装置はCD-ROMではない
;CD-ROMドライブの種類を調べる
tst.b cdrom_type
bpl 2f ;コマンドラインで指定済みなので調べない
;以下はTOSHIBAコマンドが使えるドライブ
moveq.l #TOSHIBA,d1
sf.b speed_controlable_flag
lea.l (toshiba_inq0,pc),a1
lea.l (SCSINQ_ADDBUF+3,a4),a0
moveq.l #8,d0
bsr strncmp
beq 1f
;以下はSONYコマンドが使えるドライブ
moveq.l #SONY,d1
;以下は転送速度を設定できるドライブ
st.b speed_controlable_flag
lea.l (sony_inq1,pc),a1
lea.l (SCSINQ_ADDBUF+3,a4),a0
moveq.l #22,d0
bsr strncmp
beq 1f
lea.l (sony_inq2,pc),a1
lea.l (SCSINQ_ADDBUF+3,a4),a0
moveq.l #22,d0
bsr strncmp
beq 1f
;以下は転送速度を設定できないドライブ
sf.b speed_controlable_flag
lea.l (sony_inq3,pc),a1
lea.l (SCSINQ_ADDBUF+3,a4),a0
moveq.l #13,d0
bsr strncmp
beq 1f
lea.l (sony_inq4,pc),a1
lea.l (SCSINQ_ADDBUF+3,a4),a0
moveq.l #15,d0
bsr strncmp
beq 1f
lea.l (sony_inq5,pc),a1
lea.l (SCSINQ_ADDBUF+3,a4),a0
moveq.l #22,d0
bsr strncmp
beq 1f
lea.l (sony_inq6,pc),a1
lea.l (SCSINQ_ADDBUF+3,a4),a0
moveq.l #22,d0
bsr strncmp
beq 1f
lea.l (sony_inq7,pc),a1
lea.l (SCSINQ_ADDBUF+3,a4),a0
moveq.l #16,d0
bsr strncmp
beq 1f
lea.l (sony_inq8,pc),a1
lea.l (SCSINQ_ADDBUF+3,a4),a0
moveq.l #22,d0
bsr strncmp
beq 1f
;ドライブの種類が不明
bsr print_scsi_error_message_header
lea.l (m_unknown_drive,pc),a0
bsr eprintcrlf
bsr display_inquiry
1: move.b d1,cdrom_type
2:
;メディアが準備できているか調べる
moveq.l #TESTUNIT_RETRY_COUNT-1,d7
1: move.l scsiid,d4
SCSI _S_TESTUNIT
move.l d0,d1
beq 2f
moveq.l #50,d0 ;0.5秒待つ
bsr wait_sec
dbra d7,1b
move.l d1,d0
; bmi 80f ;指定されたSCSI-IDの装置は動作不可能
bne 86f ;メディアが挿入されていない
2:
;トラック情報を取得する
bsr get_track_info
bmi 85f
;CD名を表示する
lea.l cd_name,a0
tst.b (a0)
beq @f
bsr silent_eprintcrlf
@@:
;ブロックサイズとリードエラーリカバリパラメータを保存する
bsr save_blocksize_readrecovery ;エラー無視
;転送速度を保存する
bsr save_cdromspeed ;エラー無視
;転送速度を変更する
bsr change_cdromspeed ;エラー無視
move.l scsiid,initialized_scsiid
98: moveq.l #0,d0
99: movem.l (sp)+,d1-d7/a0-a6
rts
80: bsr print_scsi_error_message_header
move.w #EXIT_SCSI_ID_ERROR,exit_code
lea.l (m_scsi_id_error,pc),a0
bra 89f
81: bsr print_scsi_error_message_header
move.w #EXIT_INQUIRY_ERROR,exit_code
lea.l (m_inquiry_error,pc),a0
bra 89f
82: bsr print_scsi_error_message_header
move.w #EXIT_NOT_CDROM,exit_code
lea.l (m_not_cdrom,pc),a0
bsr eprintcrlf
bsr display_inquiry
bra 90f
85: bsr print_scsi_error_message_header
move.w #EXIT_MEDIA_INF_ERROR,exit_code
lea.l (m_media_inf_error,pc),a0
bsr eprintcrlf
bsr display_inquiry
bra 90f
86: bsr print_scsi_error_message_header
move.w #EXIT_MEDIA_NOT_READY,exit_code
lea.l (m_media_not_ready,pc),a0
89: bsr eprintcrlf
90: moveq.l #-1,d0
bra 99b
;以下はTOSHIBAコマンドが使えるドライブ
toshiba_inq0: .dc.b 'TOSHIBA '
;以下はSONYコマンドが使えるドライブ
sony_inq0: .dc.b 'SONY '
;以下は転送速度を設定できるドライブ
sony_inq1: .dc.b 'SONY CD-ROM CDU-561'
sony_inq2: .dc.b 'SONY CD-ROM CDU-55S'
;以下は転送速度を設定できないドライブ
sony_inq3: .dc.b 'NRC MBR-7'
sony_inq4: .dc.b 'MATSHITAPD-1 LF'
sony_inq5: .dc.b 'PIONEER CD-ROM DR-124X'
sony_inq6: .dc.b 'PIONEER CD-ROM DR-U06S'
sony_inq7: .dc.b 'NAKAMICHMJ-5.16S'
sony_inq8: .dc.b 'TEAC CD-ROM CD-516S'
m_scsi_id_error: .dc.b ' の装置にアクセスできません',0
m_inquiry_error: .dc.b ' の装置の inquiry の取得に失敗しました',0
m_not_cdrom: .dc.b ' の装置は CD-ROM ドライブではないようです',0
m_unknown_drive: .dc.b ' の CD-ROM ドライブには未対応です.SONY コマンドを試みます',0
m_media_inf_error: .dc.b ' の装置の CD のトラック情報の取得に失敗しました',0
m_media_not_ready: .dc.b ' の CD-ROM ドライブはメディアの準備ができていません',0
.even
.data
.align 4
initialized_scsiid:: .dc.l -2 ;init_cdrom済みのscsiid
cdrom_type:: .dc.b -1 ;CD-ROMの種類(-1=不明,0=SONY,1=TOSHIBA)
speed_controlable_flag:: .dc.b 0 ;-1=CDU-561/CDU-55S(転送速度の指定ができる)
.bss
.even
inquiry_buffer: .ds.b SCSINQ_SIZE
;----------------------------------------------------------------
;CD-ROMドライブの後始末
; scsiidを設定してからコールすること
.text
.align 4,$2048
tini_cdrom::
tst.l initialized_scsiid
bmi 98f
bsr restore_cdromspeed
bsr restore_readrecovery
bsr restore_blocksize
98: moveq.l #0,d0 ;エラー無視
rts
;----------------------------------------------------------------
;エラーメッセージの先頭部分としてSCSI-IDを表示する
.text
.align 4,$2048
print_scsi_error_message_header::
movem.l d0/a0,-(sp)
bsr eaonly
lea.l (m_scsi_error_header,pc),a0
bsr eprint
moveq.l #0,d0
move.w scsiid+2,d0
bsr utos_eprint
tst.w scsiid
beq @f
lea.l (m_scsi_error_header_1,pc),a0
bsr eprint
moveq.l #0,d0
move.w scsiid,d0
bsr utos_eprint
lea.l (m_scsi_error_header_2,pc),a0
bsr eprint
@@: movem.l (sp)+,d0/a0
rts
m_scsi_error_header: .dc.b 'SCSI-ID=',0
m_scsi_error_header_1: .dc.b '(LUN=',0
m_scsi_error_header_2: .dc.b ')',0
;----------------------------------------------------------------
;CD-ROMドライブのブロックサイズとリードエラーリカバリパラメータを保存する
;>d0.l:-1=エラー
;>n-flag:mi=エラー
.text
.align 4,$2048
save_blocksize_readrecovery::
movem.l d1-d7/a0-a6,-(sp)
tst.b blocksize_readrecovery_saved
bne 98f ;保存済み
moveq.l #$01,d2 ;ページコード($01=リードエラーリカバリパラメータ)
moveq.l #20,d3 ;アロケーション長
move.l scsiid,d4
lea.l blocksize_readrecovery_buffer,a1
SCSI _S_MODESENSE
move.l d0,d1
bsr scsistssns
bne 90f ;リードエラーリカバリパラメータページが読めない
lea.l blocksize_readrecovery_buffer,a1
cmpi.b #$08,(3,a1)
bne 90f ;ブロックデスクリプタがない
;(_S_MODESENSEの仕様が違う)
cmpi.b #$01,(12,a1)
bne 90f ;ページコードが違う
cmpi.b #$06,(13,a1)
bne 90f ;リードエラーリカバリパラメータページの長さが違う
lea.l current_blockdescriptor,a0 ;ブロックデスクリプタを保存する
move.l (4,a1),(a0)+
move.l (8,a1),(a0)+
st.b blocksize_readrecovery_saved
98: moveq.l #0,d0
99: movem.l (sp)+,d1-d7/a0-a6
rts
90: sf.b blocksize_readrecovery_saved
tst.l d0 ;1=エラー(リトライ可),-1=エラー(リトライ不可)
smi.b d0
subq.b #1,d0 ;-1=エラー(リトライ可),-2=エラー(リトライ不可)
move.b d0,scsicmd_error_call
bsr print_scsicmd_error
bsr print_scsi_error_message_header
lea.l (m_blocksize_readrecovery_save_failed,pc),a0
bsr eprintcrlf
bsr display_inquiry
moveq.l #-1,d0
bra 99b
m_blocksize_readrecovery_save_failed:
.dc.b ' のリードエラーリカバリパラメータの保存に失敗しました',0
.data
blocksize_readrecovery_saved:
.dc.b 0 ;-1=ブロックサイズとリードエラーリカバリパラメータが保存された
;(保存できたときだけ復元できる)
.data
.even
;現在のブロックデスクリプタ
current_blockdescriptor:
.dc.b $00 ;デンシティコード
.dc.b $00,$00,$00 ;ブロック数
.dc.b $00 ;Reserved
.dc.b $00,$08,$00 ;ブロック長
.bss
.even
blocksize_readrecovery_buffer:
;モードパラメータヘッダ
;+0
.ds.b 1 ;$00 モードパラメータ長(Sense時のみ)
.ds.b 1 ;$00 メディアタイプ
.ds.b 1 ;$00 デバイス固有パラメータ
.ds.b 1 ;$08 ブロックデスクリプタ長
;ブロックデスクリプタ
;+4
.ds.b 1 ;$00 デンシティコード
.ds.b 3 ;$00,$00,$00 ブロック数
.ds.b 1 ;$00 Reserved
.ds.b 3 ;$00,$08,$00 ブロック長
;モードパラメータページ
;+12
.ds.b 1 ;$01 ページコード($01=リードエラーリカバリパラメータ)
.ds.b 1 ;$06 ページ長
.ds.b 1 ;$11 リードエラーリカバリパラメータ
; ($11=エラー無視,訂正はCIRCのみ)
.ds.b 1 ;$00 リードリトライ回数
.ds.b 4 ;$00,$00,$00,$00 Reserved
;+20
.ds.b 12 ;予備
;----------------------------------------------------------------
;CD-ROMドライブのブロックサイズを変更する
;<a0.l:ブロックデスクリプタ
; $0000 $00 Reserved
; $0001 $00,$08,$00 ブロック長
; $0004 $00 デンシティコード
; $0005 $00,$00,$00 ブロック数
; (8バイト)
.text
.align 4,$2048
change_blocksize::
movem.l d1-d7/a0-a6,-(sp)
tst.b blocksize_readrecovery_saved
beq 91f ;保存されていないので変更できない
move.l (a0)+,d6 ;$00 デンシティコード
;$00,$00,$00 ブロック数
move.l (a0)+,d7 ;$00 Reserved
;$00,$08,$00 ブロック長
lea.l current_blockdescriptor,a1
cmp.l (a1)+,d6
bne @f
cmp.l (a1)+,d7
beq 98f ;現在のブロックデスクリプタと同じなので変更しない
@@: move.l d7,-(sp) ;$00 Reserved
;$00,$08,$00 ブロック長
move.l d6,-(sp) ;$00 デンシティコード
;$00,$00,$00 ブロック数
move.l #$00_00_00_08,-(sp) ;$00 モードパラメータ長(Sense時のみ)
;$00 メディアタイプ
;$00 デバイス固有パラメータ
;$08 ブロックデスクリプタ長
movea.l sp,a1
moveq.l #12,d3
bsr modeselect
lea.l (12,sp),sp
bmi 90f
lea.l current_blockdescriptor,a0
move.l d6,(a0)+
move.l d7,(a0)+
98: moveq.l #0,d0
99: movem.l (sp)+,d1-d7/a0-a6
rts
90: bsr print_scsicmd_error
91: bsr print_scsi_error_message_header
lea.l (m_blocksize_change_failed,pc),a0
bsr eprintcrlf
moveq.l #-1,d0
bra 99b
m_blocksize_change_failed:
.dc.b ' のブロックサイズの変更に失敗しました',0
;----------------------------------------------------------------
;CD-ROMドライブのリードエラーリカバリパラメータを変更する
.text
.align 4,$2048
change_readrecovery::
movem.l d1-d7/a0-a6,-(sp)
tst.b readrecovery_changed
bne 98f ;変更済み
tst.b blocksize_readrecovery_saved
beq 98f ;保存されていないので変更しない
clr.l -(sp) ;$00,$00,$00,$00 Reserved
move.l #$01_06_11_00,-(sp) ;$01 ページコード($01=リードエラーリカバリパラメータ)
;$06 ページ長
;$11 リードエラーリカバリパラメータ
; ($11=エラー無視,訂正はCIRCのみ)
;$00 リードリトライ回数
lea.l current_blockdescriptor+8,a1
move.l -(a1),-(sp) ;$00 Reserved
;$00,$08,$00 ブロック長
move.l -(a1),-(sp) ;$00 デンシティコード
;$00,$00,$00 ブロック数
move.l #$00_00_00_08,-(sp) ;$00 モードパラメータ長(Sense時のみ)
;$00 メディアタイプ
;$00 デバイス固有パラメータ
;$08 ブロックデスクリプタ長
movea.l sp,a1
moveq.l #20,d3
bsr modeselect ;エラーは無視
lea.l (20,sp),sp
spl.b readrecovery_changed ;-1=変更された
bpl 98f
bsr print_scsicmd_error
bsr print_scsi_error_message_header
lea.l (m_readrecovery_change_failed,pc),a0
bsr eprintcrlf
bsr display_inquiry
98: moveq.l #0,d0
99: movem.l (sp)+,d1-d7/a0-a6
rts
m_readrecovery_change_failed:
.dc.b ' のリードエラーリカバリパラメータの変更に失敗しました',0
.data
readrecovery_changed:
.dc.b 0 ;-1=リードエラーリカバリパラメータが変更された
;----------------------------------------------------------------
;CD-ROMドライブのブロックサイズを復元する
.text
.align 4,$2048
restore_blocksize::
movem.l d1-d7/a0-a6,-(sp)
tst.b blocksize_readrecovery_saved
beq 98f ;保存されていないので復元できない
lea.l blocksize_readrecovery_buffer+12,a1
move.l -(a1),-(sp) ;$00 Reserved
;$00,$08,$00 ブロック長
move.l -(a1),-(sp) ;$00 デンシティコード
;$00,$00,$00 ブロック数
move.l #$00_00_00_08,-(sp) ;$00 モードパラメータ長(Sense時のみ)
;$00 メディアタイプ
;$00 デバイス固有パラメータ
;$08 ブロックデスクリプタ長
movea.l sp,a1
moveq.l #12,d3
bsr modeselect
lea.l (12,sp),sp
bmi 90f
lea.l current_blockdescriptor,a0
lea.l blocksize_readrecovery_buffer+4,a1
move.l (a1)+,(a0)+
move.l (a1)+,(a0)+
98: moveq.l #0,d0
99: movem.l (sp)+,d1-d7/a0-a6
rts
90: bsr print_scsicmd_error
bsr print_scsi_error_message_header
lea.l (m_blocksize_restore_failed,pc),a0
bsr eprintcrlf
moveq.l #-1,d0
bra 99b
m_blocksize_restore_failed:
.dc.b ' のブロックサイズの復元に失敗しました',0
;----------------------------------------------------------------
;CD-ROMドライブのリードエラーリカバリパラメータを復元する
.text
.align 4,$2048
restore_readrecovery::
movem.l d1-d7/a0-a6,-(sp)
tst.b blocksize_readrecovery_saved
beq 98f ;保存されていないので復元できない
lea.l blocksize_readrecovery_buffer+20,a1
move.l -(a1),-(sp) ;$00,$00,$00,$00 Reserved
move.l -(a1),-(sp) ;$01 ページコード($01=リードエラーリカバリパラメータ)
;$06 ページ長
;$11 リードエラーリカバリパラメータ
; ($11=エラー無視,訂正はCIRCのみ)
;$00 リードリトライ回数
lea.l current_blockdescriptor+8,a1
move.l -(a1),-(sp) ;$00 Reserved
;$00,$08,$00 ブロック長
move.l -(a1),-(sp) ;$00 デンシティコード
;$00,$00,$00 ブロック数
move.l #$00_00_00_08,-(sp) ;$00 モードパラメータ長(Sense時のみ)
;$00 メディアタイプ
;$00 デバイス固有パラメータ
;$08 ブロックデスクリプタ長
movea.l sp,a1
moveq.l #20,d3
bsr modeselect
lea.l (20,sp),sp
bmi 90f
98: moveq.l #0,d0
99: movem.l (sp)+,d1-d7/a0-a6
rts
90: bsr print_scsicmd_error
bsr print_scsi_error_message_header
lea.l (m_readrecovery_restore_failed,pc),a0
bsr eprintcrlf
moveq.l #-1,d0
bra 99b
m_readrecovery_restore_failed:
.dc.b ' のリードエラーリカバリパラメータの復元に失敗しました',0
;----------------------------------------------------------------
;CD-ROMドライブの転送速度を保存する
.text
.align 4,$2048
save_cdromspeed::
movem.l d1-d7/a0-a6,-(sp)
tst.b cdromspeed_saved
bne 98f ;保存済み
tst.w cdrom_speed
bpl @f ;転送速度の指定があるのでドライブの種類に関わらず保存を試みる
tst.b speed_controlable_flag
beq 98f ;転送速度を設定できないドライブ
@@: moveq.l #$31,d2 ;ページコード
moveq.l #16,d3 ;アロケーション長
move.l scsiid,d4
lea.l cdromspeed_buffer,a1
SCSI _S_MODESENSE
move.l d0,d1
bsr scsistssns
bne 90f ;保存できない
lea.l cdromspeed_buffer,a1
cmpi.b #$08,(3,a1)
bne 90f ;ブロックデスクリプタがない
;(_S_MODESENSEの仕様が違う)
cmpi.b #$31,(12,a1)
bne 90f ;ページコードが違う
cmpi.b #$02,(13,a1)
bne 90f ;ページの長さが違う
st.b cdromspeed_saved
98: moveq.l #0,d0
99: movem.l (sp)+,d1-d7/a0-a6
rts
90: sf.b cdromspeed_saved
tst.l d0 ;1=エラー(リトライ可),-1=エラー(リトライ不可)
smi.b d0
subq.b #1,d0 ;-1=エラー(リトライ可),-2=エラー(リトライ不可)
move.b d0,scsicmd_error_call
bsr print_scsicmd_error
bsr print_scsi_error_message_header
lea.l (m_cdromspeed_save_failed,pc),a0
bsr eprintcrlf
bsr display_inquiry
moveq.l #-1,d0
bra 99b
m_cdromspeed_save_failed:
.dc.b ' の転送速度の取得に失敗しました',0
.data
cdromspeed_saved:
.dc.b 0 ;-1=転送速度が保存された
.bss
.even
cdromspeed_buffer:
;モードパラメータヘッダ
;+0
.ds.b 1 ;$00 モードパラメータ長(Sense時のみ)
.ds.b 1 ;$00 メディアタイプ
.ds.b 1 ;$00 デバイス固有パラメータ
.ds.b 1 ;$08 ブロックデスクリプタ長
;ブロックデスクリプタ
;+4
.ds.b 1 ;$00 デンシティコード
.ds.b 3 ;$00,$00,$00 ブロック数
.ds.b 1 ;$00 Reserved
.ds.b 3 ;$00,$08,$00 ブロック長
;モードパラメータページ
;+12
.ds.b 1 ;$31 ページコード($31=転送速度設定)
.ds.b 1 ;$02 ページ長
.ds.b 1 ;$FF 転送速度($FF=最高速)
.ds.b 1 ;$00 Reserved
;+16
.ds.b 16 ;予備
;----------------------------------------------------------------
;CD-ROMドライブの転送速度を変更する
.text
.align 4,$2048
change_cdromspeed::
movem.l d1-d7/a0-a6,-(sp)
tst.b cdromspeed_changed
bne 98f ;変更済み
tst.b cdromspeed_saved
beq 98f ;保存されていないので変更しない
tst.w cdrom_speed
bpl @f ;転送速度の指定があるのでドライブの種類に関わらず変更を試みる
tst.b speed_controlable_flag
beq 98f ;転送速度を設定できないドライブ
@@: move.l #$31_02_FF_00,-(sp) ;$31 ページコード($31=転送速度設定)
;$02 ページ長
move.b cdrom_speed+1,(2,sp) ;$FF 転送速度($FF=最高速)
;$00 Reserved
lea.l current_blockdescriptor+8,a1
move.l -(a1),-(sp) ;$00 Reserved
;$00,$08,$00 ブロック長
move.l -(a1),-(sp) ;$00 デンシティコード
;$00,$00,$00 ブロック数
move.l #$00_00_00_08,-(sp) ;$00 モードパラメータ長(Sense時のみ)
;$00 メディアタイプ
;$00 デバイス固有パラメータ
;$08 ブロックデスクリプタ長
movea.l sp,a1
moveq.l #16,d3
bsr modeselect ;エラーは無視
lea.l (16,sp),sp
bmi 90f
st.b cdromspeed_changed
98: moveq.l #0,d0
99: movem.l (sp)+,d1-d7/a0-a6
rts
90: sf.b cdromspeed_changed
bsr print_scsicmd_error
bsr print_scsi_error_message_header
lea.l (m_cdromspeed_change_failed,pc),a0
bsr eprintcrlf
bsr display_inquiry
moveq.l #-1,d0
bra 99b
m_cdromspeed_change_failed:
.dc.b ' の転送速度の変更に失敗しました',0
.data
cdromspeed_changed:
.dc.b 0 ;-1=転送速度が変更された
;----------------------------------------------------------------
;CD-ROMドライブの転送速度を復元する
.text
.align 4,$2048
restore_cdromspeed::
movem.l d1-d7/a0-a6,-(sp)
tst.b cdromspeed_saved
beq 98f ;保存されていないので復元できない
lea.l cdromspeed_buffer+16,a1
move.l -(a1),-(sp) ;$31 ページコード($31=転送速度設定)
;$02 ページ長
;$FF 転送速度($FF=最高速)
;$00 Reserved
move.l -(a1),-(sp) ;$00 Reserved
;$00,$08,$00 ブロック長
move.l -(a1),-(sp) ;$00 デンシティコード
;$00,$00,$00 ブロック数
move.l #$00_00_00_08,-(sp) ;$00 モードパラメータ長(Sense時のみ)
;$00 メディアタイプ
;$00 デバイス固有パラメータ
;$08 ブロックデスクリプタ長
movea.l sp,a1
moveq.l #16,d3
bsr modeselect ;エラーは無視
lea.l (16,sp),sp
bmi 90f
98: moveq.l #0,d0
99: movem.l (sp)+,d1-d7/a0-a6
rts
90: bsr print_scsicmd_error
bsr print_scsi_error_message_header
lea.l (m_cdromspeed_restore_failed,pc),a0
bsr eprintcrlf
moveq.l #-1,d0
bra 99b
m_cdromspeed_restore_failed:
.dc.b ' の転送速度の復元に失敗しました',0
;----------------------------------------------------------------
;----------------------------------------------------------------
;CD-ROMのセクタをYellowBook Mode1(2048bytes/sector)で読み込む
; (density=$00,size=$0800)
;<d0.l:絶対セクタ番号
;<d1.l:セクタ数(<=65535)
;<a0.l:バッファ(セクタ数*2048バイト)
;>d0.l:-1=エラー
;>n-flag:mi=エラー
.text
.align 4,$2048
read_cdrom_mode1_2048::
movem.l d1-d7/a0-a6,-(sp)
move.l d0,d2
movea.l a0,a1
lea.l (blocksize_mode1_2048,pc),a0
bsr change_blocksize
bmi 90f
lea.l cmd_read,a0
move.l d2,(2,a0) ;絶対セクタ番号
move.w d1,d0 ;転送セクタ数
move.b d0,(8,a0) ;下位
lsr.w #8,d0
move.b d0,(7,a0) ;上位
mulu.w #2048,d1
move.l a1,-(sp) ;バッファ
move.l d1,-(sp) ;転送バイト数
move.l a0,-(sp) ;コマンド
pea.l 12.w ;コマンド長
bsr scsicmd
lea.l (16,sp),sp
bmi 90f
98: moveq.l #0,d0
99: movem.l (sp)+,d1-d7/a0-a6
rts
90: moveq.l #-1,d0
bra 99b
.even
blocksize_mode1_2048:
.dc.b $00 ;デンシティコード
.dc.b $00,$00,$00 ;ブロック数
.dc.b $00 ;Reserved
.dc.b $00,$08,$00 ;ブロック長
.data
.even
cmd_read:
.dc.b $28 ;オペレーションコード($28=Read)
.dc.b $00 ;LUN
.dc.b $00,$00,$00,$00 ;開始フレーム番号
.dc.b $00
.dc.b $00,$01 ;転送フレーム数
.dc.b $00,$00,$00
;----------------------------------------------------------------
;CD-ROMのセクタをCD-XA Mode2 form1(2048bytes/sector)で読み込む
; (density=$81,size=$0800)
;<d0.l:絶対セクタ番号
;<d1.l:セクタ数(<=65535)
;<a0.l:バッファ(セクタ数*2048バイト)
;>d0.l:-1=エラー
;>n-flag:mi=エラー
.text
.align 4,$2048
read_cdrom_mode2_2048::
movem.l d1-d7/a0-a6,-(sp)
move.l d0,d2
movea.l a0,a1
lea.l (blocksize_mode2_2048_sony,pc),a0
tst.b cdrom_type
ble @f
lea.l (blocksize_mode2_2048_toshiba,pc),a0
@@: bsr change_blocksize
bmi 90f
lea.l cmd_read,a0
move.l d2,(2,a0) ;絶対セクタ番号
move.w d1,d0 ;転送セクタ数
move.b d0,(8,a0) ;下位
lsr.w #8,d0
move.b d0,(7,a0) ;上位
mulu.w #2048,d1
move.l a1,-(sp) ;バッファ
move.l d1,-(sp) ;転送バイト数
move.l a0,-(sp) ;コマンド
pea.l 12.w ;コマンド長
bsr scsicmd
lea.l (16,sp),sp
bmi 90f
98: moveq.l #0,d0
99: movem.l (sp)+,d1-d7/a0-a6
rts
90: moveq.l #-1,d0
bra 99b
.even
blocksize_mode2_2048_sony:
.dc.b $00 ;デンシティコード
.dc.b $00,$00,$00 ;ブロック数
.dc.b $00 ;Reserved
.dc.b $00,$08,$00 ;ブロック長
.even
blocksize_mode2_2048_toshiba:
.dc.b $81 ;デンシティコード
.dc.b $00,$00,$00 ;ブロック数
.dc.b $00 ;Reserved
.dc.b $00,$08,$00 ;ブロック長
.if 0
.data
.even
cmd_read:
.dc.b $28 ;オペレーションコード($28=Read)
.dc.b $00 ;LUN
.dc.b $00,$00,$00,$00 ;開始フレーム番号
.dc.b $00
.dc.b $00,$01 ;転送フレーム数
.dc.b $00,$00,$00
.endif
;----------------------------------------------------------------
;CD-ROMのセクタをCD-XA Mode2 form2(2324bytes/sector)で読み込む
; (density=$81,size=$0914)
;<d0.l:絶対セクタ番号
;<d1.l:セクタ数(<=65535)
;<a0.l:バッファ(セクタ数*2324バイト)
;>d0.l:-1=エラー
;>n-flag:mi=エラー
.text
.align 4,$2048
read_cdrom_mode2_2324::
movem.l d1-d7/a0-a6,-(sp)
move.l d0,d2
movea.l a0,a1
lea.l (blocksize_mode2_2324_sony,pc),a0
tst.b cdrom_type
ble @f
lea.l (blocksize_mode2_2324_toshiba,pc),a0
@@: bsr change_blocksize
bmi 90f
lea.l cmd_read,a0
move.l d2,(2,a0) ;絶対セクタ番号
move.w d1,d0 ;転送セクタ数
move.b d0,(8,a0) ;下位
lsr.w #8,d0
move.b d0,(7,a0) ;上位
mulu.w #2324,d1
move.l a1,-(sp) ;バッファ
move.l d1,-(sp) ;転送バイト数
move.l a0,-(sp) ;コマンド
pea.l 12.w ;コマンド長
bsr scsicmd
lea.l (16,sp),sp
bmi 90f
98: moveq.l #0,d0
99: movem.l (sp)+,d1-d7/a0-a6
rts
90: moveq.l #-1,d0
bra 99b
.even
blocksize_mode2_2324_sony:
.dc.b $00 ;デンシティコード
.dc.b $00,$00,$00 ;ブロック数
.dc.b $00 ;Reserved
.dc.b $00,$09,$14 ;ブロック長
.even
blocksize_mode2_2324_toshiba:
.dc.b $81 ;デンシティコード
.dc.b $00,$00,$00 ;ブロック数
.dc.b $00 ;Reserved
.dc.b $00,$09,$14 ;ブロック長
.if 0
.data
.even
cmd_read:
.dc.b $28 ;オペレーションコード($28=Read)
.dc.b $00 ;LUN
.dc.b $00,$00,$00,$00 ;開始フレーム番号
.dc.b $00
.dc.b $00,$01 ;転送フレーム数
.dc.b $00,$00,$00
.endif
;----------------------------------------------------------------
;CD-ROMのセクタをYellowBook Mode2(2336bytes/sector)で読み込む
; (density=$81,size=$0920)
;<d0.l:絶対セクタ番号
;<d1.l:セクタ数(<=65535)
;<a0.l:バッファ(セクタ数*2336バイト)
;>d0.l:-1=エラー
;>n-flag:mi=エラー
.text
.align 4,$2048
read_cdrom_mode2_2336::
movem.l d1-d7/a0-a6,-(sp)
move.l d0,d2
movea.l a0,a1
lea.l (blocksize_mode2_2336_sony,pc),a0
tst.b cdrom_type
ble @f
lea.l (blocksize_mode2_2336_toshiba,pc),a0
@@: bsr change_blocksize
bmi 90f
lea.l cmd_read,a0
move.l d2,(2,a0) ;絶対セクタ番号
move.w d1,d0 ;転送セクタ数
move.b d0,(8,a0) ;下位
lsr.w #8,d0
move.b d0,(7,a0) ;上位
mulu.w #2336,d1
move.l a1,-(sp) ;バッファ
move.l d1,-(sp) ;転送バイト数
move.l a0,-(sp) ;コマンド
pea.l 12.w ;コマンド長
bsr scsicmd
lea.l (16,sp),sp
bmi 90f
98: moveq.l #0,d0
99: movem.l (sp)+,d1-d7/a0-a6
rts
90: moveq.l #-1,d0
bra 99b
.even
blocksize_mode2_2336_sony:
.dc.b $00 ;デンシティコード
.dc.b $00,$00,$00 ;ブロック数
.dc.b $00 ;Reserved
.dc.b $00,$09,$20 ;ブロック長
.even
blocksize_mode2_2336_toshiba:
.dc.b $81 ;デンシティコード
.dc.b $00,$00,$00 ;ブロック数
.dc.b $00 ;Reserved
.dc.b $00,$09,$20 ;ブロック長
.if 0
.data
.even
cmd_read:
.dc.b $28 ;オペレーションコード($28=Read)
.dc.b $00 ;LUN
.dc.b $00,$00,$00,$00 ;開始フレーム番号
.dc.b $00
.dc.b $00,$01 ;転送フレーム数
.dc.b $00,$00,$00
.endif
;----------------------------------------------------------------
;CD-ROMのセクタをMode2(2352bytes/sector)で読み込む
; (density=$81,size=$0930)
;<d0.l:絶対セクタ番号
;<d1.l:セクタ数(<=65535)
;<a0.l:バッファ(セクタ数*2352バイト)
;>d0.l:-1=エラー
;>n-flag:mi=エラー
.text
.align 4,$2048
read_cdrom_mode2_2352::
movem.l d1-d7/a0-a6,-(sp)
move.l d0,d2
movea.l a0,a1
lea.l (blocksize_mode2_2352_sony,pc),a0
tst.b cdrom_type
ble @f
lea.l (blocksize_mode2_2352_toshiba,pc),a0
@@: bsr change_blocksize
bmi 90f
lea.l cmd_read,a0
move.l d2,(2,a0) ;絶対セクタ番号
move.w d1,d0 ;転送セクタ数
move.b d0,(8,a0) ;下位
lsr.w #8,d0
move.b d0,(7,a0) ;上位
mulu.w #2352,d1
move.l a1,-(sp) ;バッファ
move.l d1,-(sp) ;転送バイト数
move.l a0,-(sp) ;コマンド
pea.l 12.w ;コマンド長
bsr scsicmd
lea.l (16,sp),sp
bmi 90f
98: moveq.l #0,d0
99: movem.l (sp)+,d1-d7/a0-a6
rts
90: moveq.l #-1,d0
bra 99b
.even
blocksize_mode2_2352_sony:
.dc.b $00 ;デンシティコード
.dc.b $00,$00,$00 ;ブロック数
.dc.b $00 ;Reserved
.dc.b $00,$09,$30 ;ブロック長
.even
blocksize_mode2_2352_toshiba:
.dc.b $81 ;デンシティコード
.dc.b $00,$00,$00 ;ブロック数
.dc.b $00 ;Reserved
.dc.b $00,$09,$30 ;ブロック長
.if 0
.data
.even
cmd_read:
.dc.b $28 ;オペレーションコード($28=Read)
.dc.b $00 ;LUN
.dc.b $00,$00,$00,$00 ;開始フレーム番号
.dc.b $00
.dc.b $00,$01 ;転送フレーム数
.dc.b $00,$00,$00
.endif
;----------------------------------------------------------------
;CD-ROMのセクタをRedBook(2352bytes/sector)で読み込む
; (density=$82,size=$0930)
;<d0.l:絶対セクタ番号
;<d1.l:セクタ数(<=65535)
;<a0.l:バッファ(セクタ数*2352バイト)
;>d0.l:-1=エラー
;>n-flag:mi=エラー
.text
.align 4,$2048
read_cdrom_audio_2352::
movem.l d1-d7/a0-a6,-(sp)
move.l d0,d2
movea.l a0,a1
lea.l (blocksize_audio_2352_sony,pc),a0
tst.b cdrom_type
ble @f
lea.l (blocksize_audio_2352_toshiba,pc),a0
@@: bsr change_blocksize
bmi 90f
tst.b cdrom_type
bgt 1f
lea.l cmd_readcdda_sony,a0
move.l d2,(2,a0) ;絶対セクタ番号
move.w d1,(8,a0) ;転送セクタ数
bra 2f
1: lea.l cmd_read,a0
move.l d2,(2,a0) ;絶対セクタ番号
move.w d1,d0 ;転送セクタ数
move.b d0,(8,a0) ;下位
lsr.w #8,d0
move.b d0,(7,a0) ;上位
2: mulu.w #2352,d1
move.l a1,-(sp) ;バッファ
move.l d1,-(sp) ;転送バイト数
move.l a0,-(sp) ;コマンド
pea.l 12.w ;コマンド長
bsr scsicmd
lea.l (16,sp),sp
bmi 90f
98: moveq.l #0,d0
99: movem.l (sp)+,d1-d7/a0-a6
rts
90: moveq.l #-1,d0
bra 99b
.even
blocksize_audio_2352_sony:
.dc.b $00 ;デンシティコード
.dc.b $00,$00,$00 ;ブロック数
.dc.b $00 ;Reserved
.dc.b $00,$09,$30 ;ブロック長
.even
blocksize_audio_2352_toshiba:
.dc.b $82 ;デンシティコード
.dc.b $00,$00,$00 ;ブロック数
.dc.b $00 ;Reserved
.dc.b $00,$09,$30 ;ブロック長
.if 0
.data
.even
cmd_read:
.dc.b $28 ;オペレーションコード($28=Read)
.dc.b $00 ;LUN
.dc.b $00,$00,$00,$00 ;開始フレーム番号
.dc.b $00
.dc.b $00,$01 ;転送フレーム数
.dc.b $00,$00,$00
.endif
.data
.even
cmd_readcdda_sony:
.dc.b $D8 ;オペレーションコード($D8=ReadCDDA)
.dc.b $00 ;LUN
.dc.b $00,$00,$00,$00 ;開始フレーム番号
.dc.b $00,$00
.dc.b $00,$01 ;転送フレーム数
.dc.b $00,$00
;----------------------------------------------------------------
;----------------------------------------------------------------
;Inquiryを表示する
; inquiryを取得した後に実行すること
.text
.align 4,$2048
display_inquiry::
movem.l d0-d1/a0-a1,-(sp)
tst.b display_inquiry_done
bne 9f
st.b display_inquiry_done
lea.l (m_inq_1,pc),a0
bsr eprint
lea.l inq_error_tmp,a0
lea.l inquiry_buffer+SCSINQ_ADDBUF+3,a1
moveq.l #24-1,d1
1: move.b (a1)+,d0
bsr encode_esc
dbra d1,1b
sf.b (a0)
lea.l inq_error_tmp,a0
bsr eprint
lea.l (m_inq_2,pc),a0
bsr eprintcrlf
9: movem.l (sp)+,d0-d1/a0-a1
rts
m_inq_1: .dc.b 'Inquiry: [',0
m_inq_2: .dc.b ']',0
.even
.data
display_inquiry_done: .dc.b 0 ;-1=inquiryを表示した
.bss
.even
inq_error_tmp: .ds.b 256
;----------------------------------------------------------------
;----------------------------------------------------------------
;CDのトラック情報を取得する
;>d0.l:0=正常終了,-1=エラー
.text
.align 4,$2048
get_track_info::
movem.l d1-d7/a0-a6,-(sp)
move.l scsiid,d0
cmp.l trkinf_scsiid,d0
beq 98f
;トラック数とトータルタイムを取得する
lea.l cmd_work,a0
move.l a0,-(sp)
pea.l 12.w
pea.l (cmd_readtoc_readout,pc)
pea.l 10.w
bsr scsicmd
lea.l (16,sp),sp
bmi 90f
moveq.l #0,d0
move.b (2,a0),d0
beq 90f ;念のため
cmp.b #99,d0
bhi 90f ;念のため
move.l d0,cdda_mintrk
moveq.l #0,d1
move.b (3,a0),d1
beq 90f ;念のため
cmp.b #99,d1
bhi 90f ;念のため
cmp.b d0,d1
blo 90f ;念のため
move.l d1,cdda_maxtrk
move.l (8,a0),d0
and.l #$00FFFFFF,d0
beq 90f ;念のため
move.l d0,cdda_maxtim
bsr msf2frm
move.l d0,cdda_maxfrm
;CD名とトラック情報レコードを初期化する
clr.b cd_name ;CD名
lea.l cdda_trkinf,a0 ;トラック情報レコード
moveq.l #0,d0
move.w #trkinf_record_size*99/16-1,d1
1: move.l d0,(a0)+
move.l d0,(a0)+
move.l d0,(a0)+
move.l d0,(a0)+
dbra d1,1b
;先頭のトラックのトラック情報レコードのアドレスを求める
lea.l cdda_trkinf,a3
move.l cdda_mintrk,d0 ;先頭のトラック番号が1よりも大きかった場合に対応
subq.b #1,d0 ;(念のため)
mulu.w #trkinf_record_size,d0
lea.l (a3,d0.l),a3 ;cdda_mintrkのトラック情報レコードの先頭
;トラックの開始時間とデータトラックかどうかのフラグを設定する
movea.l a3,a2
move.l cdda_mintrk,d6 ;トラック番号
10: lea.l cmd_work,a0
lea.l cmd_readtoc,a1
move.b d6,(6,a1)
move.l a0,-(sp)
pea.l 12.w
move.l a1,-(sp)
pea.l 10.w
bsr scsicmd
lea.l (16,sp),sp
bmi 90f
btst.b #2,(5,a0)
sne.b (trkinf_dattrk,a2) ;-1=データトラック
move.l (8,a0),d0
and.l #$00FFFFFF,d0 ;開始位置(MSF)
move.l d0,(trkinf_toptim,a2)
bsr msf2frm
move.l d0,(trkinf_topfrm,a2)
lea.l (trkinf_record_size,a2),a2
addq.b #1,d6
cmp.l cdda_maxtrk,d6
bls 10b
;トラックの終了時間と長さを設定する
movea.l a3,a2
move.l cdda_mintrk,d6 ;トラック番号
10: cmp.l cdda_maxtrk,d6
beq 1f
move.l (trkinf_record_size+trkinf_topfrm,a2),d1
bra 2f
1: move.l cdda_maxfrm,d1
2: move.l d1,d0
subq.l #1,d0
move.l d0,(trkinf_btmfrm,a2)
bsr frm2msf
move.l d0,(trkinf_btmtim,a2)
move.l d1,d0
sub.l (trkinf_topfrm,a2),d0 ;フレーム数
ble 90f ;念のため
move.l d0,(trkinf_lenfrm,a2)
sub.l #75*2,d0 ;frm2msfが2秒増やしてしまうので調整しておく
bsr frm2msf
move.l d0,(trkinf_lentim,a2)
lea.l (trkinf_record_size,a2),a2
addq.b #1,d6
cmp.l cdda_maxtrk,d6
bls 10b
bsr super ;スーパーバイザモードに移行
;現在のCDがCDCLISTにあるか
_CDC_CHK_S
beq 29f
CDC _CDC_TRACKS
movea.l d0,a4 ;CDCの曲名リストワークアドレス
tst.l (14,a4) ;現在のCDがCDCLISTにあるか
beq 29f ;CDCLISTにない
;CD名を取得する
lea.l cd_name,a0
lea.l (18,a4),a1 ;CD名
moveq.l #36-1,d0
bsr strncpy_name
;トラック名を設定する
movea.l a3,a2
move.l cdda_mintrk,d6 ;トラック番号
10: lea.l (trkinf_name,a2),a0
.if 0
lea.l (str_track,pc),a1
bsr strcpy
move.l d6,d0
bsr utos
move.b #' ',(a0)+
clr.b (a0)
.endif
cmp.l (6,a4),d6 ;CDCLISTに登録されている最大トラック番号と比較
bhi 18f
move.w d6,d0 ;×1
lsl.w #2,d0 ;×4
add.w d6,d0 ;×5
lsl.w #3,d0 ;×40
lea.l (58,a4,d0.w),a1 ;曲名の先頭
moveq.l #36-1,d0
bsr strncpy_name
18: lea.l (trkinf_record_size,a2),a2
addq.b #1,d6
cmp.l cdda_maxtrk,d6
bls 10b
19:
29: bsr user ;ユーザモードに復帰
move.l scsiid,trkinf_scsiid
98: moveq.l #0,d0
99: movem.l (sp)+,d1-d7/a0-a6
rts
90: moveq.l #-1,d0
bra 99b
cmd_readtoc_readout:
.dc.b $43 ;オペレーションコード($43=ReadTOC)
.dc.b $02 ;LUN,MSF=1
.dc.b $00,$00,$00,$00 ;Reserved
.dc.b $AA ;トラック番号($AA=リードアウトトラック)
.dc.b $00,$0C ;アロケーション長
.dc.b $00 ;コントロールバイト
.even
.if 0
str_track: .dc.b 'トラック ',0
.even
.endif
.data
.align 4
;cdda_mintim: .dc.l 2<<8 ;開始フレームは00:02:00,
;cdda_minfrm: .dc.l 150 ; (フレーム番号=150)に固定
cdda_maxtim: .dc.l 0
cdda_maxfrm:: .dc.l 0 ;フレーム番号の最大値
trkinf_scsiid: .dc.l -1 ;トラック情報の有効なscsiid
.even
cmd_readtoc::
.dc.b $43 ;オペレーションコード($43=ReadTOC)
.dc.b $02 ;LUN,MSF=1
.dc.b $00,$00,$00,$00 ;Reserved
.dc.b $00 ;トラック番号
.dc.b $00,$0C ;アロケーション長
.dc.b $00 ;コントロールバイト
.bss
.align 4
cdda_mintrk:: .dc.l 0 ;トラック番号の最小値(1~99)
cdda_maxtrk:: .dc.l 0 ;トラック番号の最大値(1~99)
cmd_work: .ds.b 256
cd_name:: .ds.b 64 ;CD名
.align 4
cdda_trkinf:: .ds.b trkinf_record_size*99 ;トラック情報レコード
;トラック番号1~
;----------------------------------------------------------------
;曲名を得る
;<d0.l:トラック番号(1~99)
;<a0.l:曲名をコピーするバッファの先頭
;>a0.l:曲名の末尾の0の位置
;>d0.l:コピーした曲名の長さ(0=曲名が得られない)
;>z-flag:eq=曲名が得られない
.text
.align 4,$2048
get_track_name::
movem.l a0-a1,-(sp)
cmp.w #99,d0
bhi 9f ;念のため
subq.w #1,d0
bcs 9f ;念のため
mulu.w #trkinf_record_size,d0
lea.l cdda_trkinf,a1
lea.l (trkinf_name,a1,d0.l),a1
bsr strcpy
9: clr.b (a0)
move.l a0,d0
sub.l (sp)+,d0
movea.l (sp)+,a1
rts